package com.philips.work.service.impl;

import java.util.Date;
import java.util.List;

import com.philips.common.core.exception.ServiceException;
import com.philips.common.core.utils.StringUtils;
import com.philips.work.domain.*;
import com.philips.work.mapper.YwSupplierMapper;
import com.philips.work.mapper.YwUnitMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.philips.work.mapper.YwStorMoneyMapper;
import com.philips.work.service.IYwStorMoneyService;

/**
 * 入库金额Service业务层处理
 * 
 * @author philips
 * @date 2025-05-22
 */
@Service
public class YwStorMoneyServiceImpl implements IYwStorMoneyService 
{
    @Autowired
    private YwStorMoneyMapper ywStorMoneyMapper;
    @Autowired
    private YwUnitMapper ywUnitMapper;
    @Autowired
    private YwSupplierMapper ywSupplierMapper;

    /**
     * 查询入库金额
     * 
     * @param ids 入库金额主键
     * @return 入库金额
     */
    @Override
    public YwStorMoney selectYwStorMoneyByIds(Long ids)
    {
        return ywStorMoneyMapper.selectYwStorMoneyByIds(ids);
    }

    /**
     * 查询入库金额列表
     * 
     * @param ywStorMoney 入库金额
     * @return 入库金额
     */
    @Override
    public List<YwStorMoney> selectYwStorMoneyList(YwStorMoney ywStorMoney)
    {
        return ywStorMoneyMapper.selectYwStorMoneyList(ywStorMoney);
    }

    /**
     * 新增入库金额
     * 
     * @param ywStorMoney 入库金额
     * @return 结果
     */
    @Override
    public int insertYwStorMoney(YwStorMoney ywStorMoney)
    {
        judgeImport(ywStorMoney);
        return ywStorMoneyMapper.insertYwStorMoney(ywStorMoney);
    }

    /**
     * 修改入库金额
     * 
     * @param ywStorMoney 入库金额
     * @return 结果
     */
    @Override
    public int updateYwStorMoney(YwStorMoney ywStorMoney)
    {
        judgeImport(ywStorMoney);
        ywStorMoney.setUpTime(new Date());
        return ywStorMoneyMapper.updateYwStorMoney(ywStorMoney);
    }

    /**
     * 批量删除入库金额
     * 
     * @param idss 需要删除的入库金额主键
     * @return 结果
     */
    @Override
    public int deleteYwStorMoneyByIdss(Long[] idss)
    {
        return ywStorMoneyMapper.deleteYwStorMoneyByIdss(idss);
    }

    /**
     * 删除入库金额信息
     * 
     * @param ids 入库金额主键
     * @return 结果
     */
    @Override
    public int deleteYwStorMoneyByIds(Long ids)
    {
        return ywStorMoneyMapper.deleteYwStorMoneyByIds(ids);
    }

    /**
     * 导入数据
     *
     * @param storMoneyList 数据列表 YwStorMoney ywStorMoney
     * @param updateSupport 是否更新支持，如果已存在，则进行更新数据
     * @return 结果
     */
    @Override
    public String importStorMoney(List<YwStorMoney> storMoneyList, boolean updateSupport)
    {
        if (StringUtils.isNull(storMoneyList) || storMoneyList.isEmpty())
        {
            throw new ServiceException("导入数据不能为空！");
        }
        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        for (YwStorMoney po : storMoneyList)
        {
            try
            {
                /*
                目前只要写入，不管更新的问题
                 */
                // 机构单位、供应商和3個是否有問題的狀態維護
                judgeImport(po);
                ywStorMoneyMapper.insertYwStorMoney(po);
                successNum++;
                successMsg.append("<br/>").append(successNum).append(" 导入成功");
            }
            catch (Exception e)
            {
                failureNum++;
                String msg = "<br/>" + failureNum  + " 导入失败：";
                failureMsg.append(msg).append(e.getMessage());
            }
        }
        if (failureNum > 0)
        {
            failureMsg.insert(0, "很抱歉，导入失败！共 " + failureNum + " 条数据格式不正确，错误如下：");
            throw new ServiceException(failureMsg.toString());
        }
        else
        {
            successMsg.insert(0, "恭喜您，数据已全部导入成功！共 " + successNum + " 条，数据如下：");
        }
        return successMsg.toString();
    }

    /**
     * 判断导入内容是否和标准库一致，同时赋值整表是否有问题的判断结果
     * @param ywStorMoney
     */
    public void judgeImport(YwStorMoney ywStorMoney) {
        // 1. 處理机构单位信息
        Long unitId = ywStorMoney.getUnitId();
        String unitName = ywStorMoney.getUnitName();
        // 1.1 導入情況，ID為空，name有值
        if(unitId==null){
            if(StringUtils.isNotEmpty(unitName)){
                YwUnit ywUnit = new YwUnit();
                ywUnit.setUnitName(unitName);
                List<YwUnit> ywUnits = ywUnitMapper.selectYwUnitList(ywUnit);
                // 1.1.1 通過单位名查到了机构单位信息，標準，棒！
                if(ywUnits!=null && !ywUnits.isEmpty()){
                    ywStorMoney.setUnitId(ywUnits.get(0).getIds());
                    ywStorMoney.setIsUnit("1");
                }else{
                    // 1.1.2 通過单位名沒有查到机构单位信息，記錄數據有問題！
                    ywStorMoney.setIsUnit("0");
                }
            }else{
                // 1.1.3 導入數據進來的，但是也沒有提供机构单位信息，記錄數據有問題！
                ywStorMoney.setIsUnit("0");
            }
        }
        // 1.2 通過系統寫入或更新操作
        if(unitId!=null){
            YwUnit ywUnit = ywUnitMapper.selectYwUnitByIds(unitId);
            unitName = ywUnit.getUnitName();
            ywStorMoney.setUnitName(unitName);
            // 系統寫入一定是正確的，就算是錯的，上一行代碼也改對了
            ywStorMoney.setIsUnit("1");
        }

        // 2. 處理供应商信息
        Long supplierId = ywStorMoney.getSupplierId();
        String supplierName = ywStorMoney.getSupplierName();
        // 2.1 導入情況，ID為空，name有值
        if(supplierId==null){
            if(StringUtils.isNotEmpty(supplierName)){
                YwSupplier ywSupplier = new YwSupplier();
                ywSupplier.setSupplierName(supplierName);
                List<YwSupplier> ywSuppliers = ywSupplierMapper.selectYwSupplierList(ywSupplier);
                // 2.1.1 通過供应商名查到了供应商信息，標準，棒！
                if(ywSuppliers!=null && !ywSuppliers.isEmpty()){
                    ywStorMoney.setSupplierId(ywSuppliers.get(0).getIds());
                    ywStorMoney.setIsSupplier("1");
                }else{
                    // 2.1.2 通過備注類型名沒有查到備注類型信息，記錄數據有問題！
                    ywStorMoney.setIsSupplier("0");
                }
            }else{
                // 2.1.3 導入數據進來的，但是也沒有提供供应商信息，記錄數據有問題！
                ywStorMoney.setIsSupplier("0");
            }
        }
        // 2.2 通過系統寫入或更新操作
        if(supplierId!=null){
            YwSupplier ywSupplier = ywSupplierMapper.selectYwSupplierByIds(supplierId);
            supplierName = ywSupplier.getSupplierName();
            ywStorMoney.setSupplierName(supplierName);
            // 系統寫入一定是正確的，就算是錯的，上一行代碼也改對了
            ywStorMoney.setIsSupplier("1");
        }

        // 3. 判斷整條數據整體是否有問題
        if("1".equals(ywStorMoney.getIsUnit()) && "1".equals(ywStorMoney.getIsSupplier())){
            ywStorMoney.setNoWrong("1");
        }else {
            ywStorMoney.setNoWrong("0");
        }
    }
}
